package 剑指Offer.简单;

/**
 * 给定两个整数 a 和 b ，求它们的除法的商 a/b ，要求不得使用乘号 '*'、除号 '/' 以及求余符号 '%' 。
 * <p>
 *  
 * <p>
 * 注意：
 * <p>
 * 整数除法的结果应当截去（truncate）其小数部分，例如：truncate(8.345) = 8 以及 truncate(-2.7335) = -2
 * 假设我们的环境只能存储 32 位有符号整数，其数值范围是 [−231, 231−1]。本题中，如果除法结果溢出，则返回 231 − 1
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/xoh6Oh
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class 整数除法 {

    public static void main(String[] args) {
        System.out.println(divide(1100540749,
                -1090366779));
    }

    public static int divide(int a, int b) {
        // 如果被除数为最小值 除数为-1 则结果为2的31次方-1即Integer的最大值
        if (a == Integer.MIN_VALUE && b == -1) {
            return Integer.MAX_VALUE;
        }
        // 判断两个数字是否异号
        int flag = (a > 0) ^ (b > 0) ? -1 : 1;
        // 都变为负数
        if (a > 0) a = -a;
        if (b > 0) b = -b;
        int stand = b;
        int num = 0;
        int count = 1;
        while (a < 0 && b < 0 && a <= b) {
            // 这里需要不断的加上b的大小
            a -= b;
            num += count;

            b += stand;
            count++;
            while (a < 0  && b < 0 && a > b && b <= stand) {
                b -= stand;
                count--;
            }

        }

        return flag == -1 ? -num : num;
    }

    /**
     * 简单版 会超时
     */
    public int divide001(int a, int b) {
        // 如果被除数为最小值 除数为-1 则结果为2的31次方-1即Integer的最大值
        if (a == Integer.MIN_VALUE && b == -1) {
            return Integer.MAX_VALUE;
        }
        // 判断两个数字是否异号
        int flag = (a > 0) ^ (b > 0) ? -1 : 1;
        // 都变为负数
        if (a > 0) a = -a;
        if (b > 0) b = -b;
        int num = 0;
        while (a <= b) {
            a -= b;
            num++;
        }
        return flag == -1 ? -num : num;

    }
}
